/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.invoice.controller;

import com.invoice.busines.ComprobanteBO;
import com.invoice.busines.ComprobanteBOImpl;
import com.invoice.busines.dto.ArticuloDTO;
import com.invoice.busines.dto.ClienteDTO;
import com.invoice.busines.dto.ComprobanteCampoDTO;
import com.invoice.busines.dto.ComprobanteDTO;
import com.invoice.busines.dto.ComprobanteDetalleDTO;
import com.invoice.busines.dto.VendedorDTO;
import com.invoice.enums.Estado;
import com.invoice.enums.TipoComprobante;
import com.invoice.service.contadores.Contador;
import com.invoice.service.contadores.ContadorNumComp;
import com.invoice.service.contadores.ContadorNumGuia;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author Lidia
 */
@ManagedBean
@SessionScoped
public class ComprobanteBean{
    private static final Logger logger=Logger.getLogger(ComprobanteBean.class.getName());
    private final ComprobanteBO comprobanteBO=new ComprobanteBOImpl();
    private ComprobanteDTO comprobanteDTO=new ComprobanteDTO();
    private final ContadorNumComp contadorNumComp = new ContadorNumComp();
    private final Contador contadorNumGuia = new ContadorNumGuia();
    private ComprobanteDetalleDTO comprobanteDetalleDTO = new ComprobanteDetalleDTO();
    private ClienteDTO clienteDTO = new ClienteDTO();
    private VendedorDTO vendedorDTO = new VendedorDTO();
    private List<ComprobanteCampoDTO> labels = new ArrayList<ComprobanteCampoDTO>();
    private List<ComprobanteDTO> comprobantes = new ArrayList<ComprobanteDTO>();
    private boolean habEdicion = false;
    private boolean habBusqueda = true;
    private boolean habBusquedaVendedor = true;
    private String valueButtonVendedor = "Añadir Vendedor";
    private String valueButtonCliente = "Añadir Cliente";
    @PostConstruct
    public void init() {
        try {
            comprobantes = comprobanteBO.findAll();
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
    }
    public boolean getHabEdicion(){
        return habEdicion;
    }    

    public boolean isHabBusqueda() {
        return habBusqueda;
    }

    public boolean isHabBusquedaVendedor() {
        return habBusquedaVendedor;
    }
    
    public ComprobanteDTO getComprobanteDTO() {
        return comprobanteDTO;
    }

    public void setComprobanteDTO(ComprobanteDTO comprobanteDTO) {
        this.comprobanteDTO = comprobanteDTO;
    }

    public ClienteDTO getClienteDTO() {
        return clienteDTO;
    }

    public void setClienteDTO(ClienteDTO clienteDTO) {
        this.clienteDTO = clienteDTO;
    }

    public VendedorDTO getVendedorDTO() {
        return vendedorDTO;
    }

    public void setVendedorDTO(VendedorDTO vendedorDTO) {
        this.vendedorDTO = vendedorDTO;
    }
        
    public ComprobanteDetalleDTO getComprobanteDetalleDTO() {
        return comprobanteDetalleDTO;
    }

    public void setComprobanteDetalleDTO(ComprobanteDetalleDTO comprobanteDetalleDTO) {
        this.comprobanteDetalleDTO = comprobanteDetalleDTO;
    }

    public List<ComprobanteCampoDTO> getLabels() {
        return labels;
    }

    public String getValueButtonVendedor() {
        return valueButtonVendedor;
    }

    public String getValueButtonCliente() {
        return valueButtonCliente;
    }
    
    public List<ComprobanteDTO> comprobantes() {
        try {
            comprobantes = comprobanteBO.findAll();
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        return comprobantes;
    }

    public boolean isFactura(){
        boolean isFactura = false;
        if(comprobanteDTO.getTipoComprobante() != null && comprobanteDTO.getTipoComprobante().equals(TipoComprobante.Factura)){
            isFactura = true;
        } 
        return isFactura;
    }
    public String addComprobante(){
        habEdicion = false;
        habBusqueda = true;
        habBusquedaVendedor = true;
        comprobanteDTO = new ComprobanteDTO();
        comprobanteDetalleDTO = new ComprobanteDetalleDTO();
        clienteDTO = new ClienteDTO();
        vendedorDTO = new VendedorDTO();
        comprobanteDTO.setClienteDTO(new ClienteDTO());
        comprobanteDTO.setVendedorDTO(new VendedorDTO());
        comprobanteDTO.setTotal(BigDecimal.ZERO);
        labels = new ArrayList<ComprobanteCampoDTO>();
        valueButtonVendedor = "Añadir Vendedor";
        valueButtonCliente = "Añadir Cliente";
        return "RegistroComprobante";
    }
    
    public String saveComprobante(){
        if(labels != null){
            comprobanteDTO.setComprobanteCampoDTOs(labels);
        }
        try {
            if(habEdicion){
                comprobanteBO.updateComprobante(comprobanteDTO); 
            } else {
                comprobanteDTO = comprobanteBO.addComprobante(comprobanteDTO);
            }
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        habEdicion = false;
        return "ListaComprobante";
    } 
    
    public String editComprobante(){
        habEdicion = true;
        habBusqueda = true;
        habBusquedaVendedor = true;
        valueButtonVendedor = "Añadir Vendedor";
        valueButtonCliente = "Añadir Cliente";
        comprobanteDetalleDTO = new ComprobanteDetalleDTO();
        if(comprobanteDTO.getClienteDTO() == null){
            comprobanteDTO.setClienteDTO(new ClienteDTO());
        }
        if(comprobanteDTO.getVendedorDTO() == null){
            comprobanteDTO.setVendedorDTO(new VendedorDTO());
        }
        clienteDTO = comprobanteDTO.getClienteDTO();
        vendedorDTO = comprobanteDTO.getVendedorDTO();
        labels = comprobanteDTO.getComprobanteCampoDTOs();
        if(labels == null){
            labels = new ArrayList<ComprobanteCampoDTO>();
        }
        return "RegistroComprobante";
    }
    public void addComprobanteCampo() {
        ComprobanteCampoDTO comprobanteCampoDTO = new ComprobanteCampoDTO();
        labels.add(comprobanteCampoDTO);       
    }
    public void anularComprobante(){
        try {
            if(comprobanteDTO.getComprobantedetalles()!=null){
                for (ComprobanteDetalleDTO comprobanteDetalleDTO1 : comprobanteDTO.getComprobantedetalles()) {
                    BigDecimal stock = comprobanteDetalleDTO1.getArticuloDTO().getStock();
                    comprobanteDetalleDTO1.getArticuloDTO().setStock(stock.add(comprobanteDetalleDTO1.getCant()));
                }
            }
            comprobanteDTO.setEstado(Estado.Anulado);
            comprobanteBO.updateComprobante(comprobanteDTO);
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
    }
          
    public void agregarItem() {
        try {
            if(comprobanteDetalleDTO.getArticuloDTO() != null && comprobanteDetalleDTO.getCant() != null){
                if(comprobanteDetalleDTO.getArticuloDTO().getStock().compareTo(comprobanteDetalleDTO.getCant())== -1){
                    addMessage("Mensaje", "No hay stock suficiente del Articulo "+comprobanteDetalleDTO.getArticuloDTO().getCode());
                } else {
                    boolean flag = false;
                    if(comprobanteDTO.getComprobantedetalles() != null){
                        for (ComprobanteDetalleDTO comprobanteDetalleDTO1 : comprobanteDTO.getComprobantedetalles()) {
                            if(comprobanteDetalleDTO1.getArticuloDTO().getIdArticulo().equals(comprobanteDetalleDTO.getArticuloDTO().getIdArticulo())){
                                addMessage("Duplicado","Artículo " + comprobanteDetalleDTO1.getArticuloDTO().getDescripcion()+" ya está en la lista");
                                flag = true;
                                break;
                            }
                        }
                    }
                    if(flag == false){
                        ArticuloDTO articuloDTO = comprobanteDetalleDTO.getArticuloDTO();
                        articuloDTO.setStock(articuloDTO.getStock().subtract(comprobanteDetalleDTO.getCant()));
                        articuloDTO.setPrecioVenta(comprobanteDetalleDTO.getPvp());
                        comprobanteDetalleDTO.setArticuloDTO(articuloDTO);                        
                        comprobanteDTO.addComprobantedetalle(comprobanteDetalleDTO.myClone());
                        //Total
                        comprobanteDTO.setTotal(comprobanteDTO.getTotal().add(comprobanteDetalleDTO.getPvp().multiply(comprobanteDetalleDTO.getCant())));
                        if(isFactura()){
                            //IGV
                            comprobanteDTO.setTotIva(comprobanteDTO.getTotal().multiply(new BigDecimal(0.18)));
                            //SubTotal = Total - IGV
                            comprobanteDTO.setSubTotal(comprobanteDTO.getTotal().subtract(comprobanteDTO.getTotIva()));            
                        }
                    }
                }
            } else {
                addMessage("Artículo","Insertar cantidad de artículo");
            }
            comprobanteDetalleDTO = new ComprobanteDetalleDTO();
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error al agregar", e);
        }
    }
    public void updatePrecio(){
        if(comprobanteDetalleDTO.getArticuloDTO() != null){
            comprobanteDetalleDTO.setPvp(comprobanteDetalleDTO.getArticuloDTO().getPrecioVenta());
        }
    }
    
    public void agregarCliente(){
        try {
            if(clienteDTO != null && clienteDTO.getIdCliente() != null){
                comprobanteDTO.setClienteDTO(clienteDTO);
                clienteDTO = new ClienteDTO();
            }
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error al agregar", e);
        }
    }
    public void buscarCliente(){
        habBusqueda = !habBusqueda;
        if(!habBusqueda){
            valueButtonCliente = "Cancelar";
        } else {
            valueButtonCliente = "Añadir Cliente";
        }
        clienteDTO = new ClienteDTO();
        comprobanteDTO.setClienteDTO(clienteDTO);
    }
    
    public void agregarVendedor(){
        try {
            if(vendedorDTO != null && vendedorDTO.getIdUsuario() != null){
                comprobanteDTO.setVendedorDTO(vendedorDTO);
                vendedorDTO = new VendedorDTO();
            }
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error al agregar", e);
        }
    }
    public void buscarVendedor(){
        habBusquedaVendedor = !habBusquedaVendedor;
        if(!habBusquedaVendedor){
            valueButtonVendedor = "Cancelar";
        } else {
            valueButtonVendedor = "Añadir Vendedor";
        }
        vendedorDTO = new VendedorDTO();
        comprobanteDTO.setVendedorDTO(vendedorDTO);
    }
    public void generateNumComp(){
        if(comprobanteDTO.getTipoComprobante() != null && comprobanteDTO.getTipoComprobante() != null){
            comprobanteDTO.setNumComp(contadorNumComp.generarClave("001",comprobanteDTO.getTipoComprobante()));
        }        
    }
    public void generateNumGuia(){
        comprobanteDTO.setNumGuia(contadorNumGuia.generarClave(""));
    }
    
    public void onCancel() {
        ArticuloDTO articuloDTO = comprobanteDetalleDTO.getArticuloDTO();
        articuloDTO.setStock(articuloDTO.getStock().add(comprobanteDetalleDTO.getCant()));
        comprobanteDetalleDTO.setArticuloDTO(articuloDTO);
        comprobanteDTO.removeComprobanteDetalleDTO(comprobanteDetalleDTO);
        //Total
        comprobanteDTO.setTotal(comprobanteDTO.getTotal().subtract(comprobanteDetalleDTO.getPvp().multiply(comprobanteDetalleDTO.getCant())));
        if(isFactura()){
            //IGV
            comprobanteDTO.setTotIva(comprobanteDTO.getTotal().multiply(new BigDecimal(0.18)));
            //SubTotal = Total - IGV
            comprobanteDTO.setSubTotal(comprobanteDTO.getTotal().subtract(comprobanteDTO.getTotIva()));            
        }
    }
    
    public void addMessage(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
}
